module about_operator_overloading;

import dunit;
import helpers;

class AboutOperatorOverloading {
  mixin UnitTest;

  //Operator overloading is accomplished by rewriting operators 
  // whose operands are class or struct objects into calls to specially named member functions. 
  //No additional syntax is used.

  struct Color {
  	ubyte r,g,b;
  	bool opEquals(Color col) const {
  		return (this.r == col.r) && (this.g==col.g) && (this.b == col.b);
  	}
	
	size_t toHash() const nothrow @safe {
		return r*256*256+g*256+b;
	}
  }

  @Test
  void colorEquality() {
  	const Color green1={r:0, g:200, b:0};
  	const Color red={r:200, g:0, b:0};
  	const Color green2={r:0, g:200, b:0};
  	auto result1=(green1==green2); 	
  	auto result2=(green1==red);
  	assertEquals(result1,FILL_IN_TRUE_OR_FALSE);
	assertEquals(result2,FILL_IN_TRUE_OR_FALSE);
  }

  //TODO show off other operator overloading

}